package org.lanqiao.tjut.entity;

import java.util.List;

import java.util.Scanner;

import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.lanqiao.tjut.db.DBDriverFactory;
import org.lanqiao.tjut.service.EduService;

public class Teacher {
	// 新建遍历打印集合类的实例对象
	Printlist pl = new Printlist();

	/**
	 * 教师登录验证，输入账号密码
	 */
	public void entryTeacher() {
		// 控制台显示要求教师输入账号密码
		Scanner input = new Scanner(System.in);
		System.out.println("请输入账号：");
		String accountNum = input.next();
		System.out.println("请输入密码：");
		String passwordNum = input.next();
		// 此处验证教师输入的账号密码是否正确，不正确要求重新输入
		if (accountNum.equals("admin") && passwordNum.equals("123456")) {
			// 如果教师输入正确的账号密码，进入教师功能菜单
			logTeacher();
		} else {
			System.out.println("账号或密码输入错误，请重新输入！");
			// 如果教师输入错误的账号密码，再次调用本方法，重新输入
			entryTeacher();
		}
	}

	/**
	 * 教师功能菜单
	 */
	public void logTeacher() {
		// 新建教务管理系统登录界面类的实例对象
		EduService edu = new EduService();
		// 从控制台输出教师功能菜单
		Scanner input = new Scanner(System.in);
		System.out.println("**************************");
		System.out.println("*      1.添加学生信息                 *");
		System.out.println("*      2.查询学生信息                 *");
		System.out.println("*      3.修改学生信息                 *");
		System.out.println("*      4.删除学生信息                 *");
		System.out.println("*      0.任意键返回主登录界面  *");
		System.out.println("**************************");
		System.out.println("请选择功能菜单：");
		int funNum = input.nextInt();
		// 选择不同的功能菜单序号，进入对应的功能
		switch (funNum) {
		case 1:
			// 添加学生信息
			insertStu();
			break;
		case 2:
			// 查询功能菜单列表
			queryMenu();
			break;
		case 3:
			// 修改学生信息
			updateStu();
			break;
		case 4:
			// 删除学生信息
			deleteStu();
			break;
		case 0:
		default:
			// 返回主登录界面
			edu.Login();
			break;
		}
	}

	/**
	 * 教师菜单1.添加学生信息
	 */
	public void insertStu() {
		Scanner sc = new Scanner(System.in);
		// 在添加完一个学生的完整信息后，可以判定是否继续输入
		while (true) {
			// 输入学生的学号
			System.out.println("录入学生学号：");
			int instuid = sc.nextInt();
			// 检验该学生是否已经存在数据库中
			boolean isExist = isStudentexisted(instuid);
			// 判定结果返回true，提示已经存在，不能再次录入。返回false，进行更多信息录入
			if (isExist) {
				System.out.println("该学生信息已经存在，不能再次录入！");
			} else {
				// 录入学生信息
				System.out.println("该学生信息为第一次录入，请继续录入该学生其他信息：");
				System.out.println("录入学生初始密码：");
				String strStupword = sc.next();
				System.out.println("录入学生姓名:");
				String strStuname = sc.next();
				System.out.println("录入学生性别:");
				String strStuSex = sc.next();
				System.out.println("录入学生年龄:");
				int inStuage = sc.nextInt();
				System.out.println("录入学生电话(10位):");
				int inStutelnum = sc.nextInt();
				System.out.println("录入学生地址:");
				String strStuaddress = sc.next();
				System.out.println("录入学生就读状态:(0:在读|1:休学)");
				int instustate = sc.nextInt();
				// 进行数据库操作的数据库语句
				String strSql = "INSERT INTO EDUSTUDENT(STUPWORD,STUNAME,STUID,STUSEX,STUAGE,STUTELNUM,STUADDRESS,STUSTATE) "
						+ "VALUES(?,?,?,?,?,?,?,?)";
				// 将新录入学生信息插入数据库中
				int i = DBDriverFactory.getDBDriverInstance().update(strSql, new Object[] { strStupword, strStuname,
						instuid, strStuSex, inStuage, inStutelnum, strStuaddress, instustate });
				if (i > 0) {
					System.out.println("该学生信息录入成功！");
				} else {
					System.out.println("该学生信息录入失败！");
				}
				// 每次新增一名学生，就显示一次所有的学生信息，要求--根据录入的次序倒叙打印
				String strSql1 = "SELECT * FROM EDUSTUDENT  ORDER BY STUCODE DESC";
				List lst = DBDriverFactory.getDBDriverInstance().query(strSql1, new MapListHandler());
				pl.printList(lst);
			}
			// 进行判定，是否继续录入
			System.out.println("是否继续录入其他学生的信息？(输入-1停止录入并返回上层功能菜单，输入其他键继续)");
			String strInput = sc.next();
			if (strInput.equals("-1")) {
				break;
			}
		}
		// 返回教师功能菜单
		logTeacher();
	}

	/**
	 * 查询功能菜单列表
	 */
	public void queryMenu() {
		Scanner sc = new Scanner(System.in);
		System.out.println("***1.查询所有学生信息****************");
		System.out.println("***2.根据指定编号(学号)查询单个学生信息**");
		System.out.println("***3.根据姓名模糊查询学生信息**********");
		System.out.println("***4.根据地址模糊查询学生信息**********");
		System.out.println("***5.根据年龄段查询学生信息************");
		System.out.println("***6.返回上层菜单*******************");
		int inIput = sc.nextInt();
		switch (inIput) {
		case 1:
			// 查询所有学生信息
			queryAllStu();
			break;
		case 2:
			// 根据指定编号(学号)查询单个学生信息
			queryOneStu();
			break;
		case 3:
			// 根据姓名模糊查询学生信息
			queryNameStu();
			break;
		case 4:
			// 根据地址模糊查询学生信息
			queryAdreStu();
			break;
		case 5:
			// 根据年龄段查询学生信息
			queryAgeStu();
			break;
		case 6:
			// 返回上层菜单--教室功能菜单
			logTeacher();
			break;
		default:
			System.out.println("输入错误，请重新输入！");
			queryMenu();
		}
	}

	/**
	 * 1.查询所有学生信息
	 */
	public void queryAllStu() {
		Scanner sc = new Scanner(System.in);
		// 数据库操作语句
		String strSql = "SELECT * FROM EDUSTUDENT WHERE STUSTATE=0";
		// 从数据库中进行查询，查询结果保存在list集合中
		List lst = DBDriverFactory.getDBDriverInstance().query(strSql, new MapListHandler());
		// 打印查询结果
		pl.printList(lst);
		// 返回上层菜单
		System.out.println("输入-1返回上层功能菜单");
		String strInput = sc.next();
		if (strInput.equals("-1")) {
			// 返回上层菜单--查询功能菜单
			queryMenu();
		}
	}

	/**
	 * 2.根据指定编号(学号)查询单个学生信息
	 */
	public void queryOneStu() {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入需要查询的学生的学号：");
		int inStuid = sc.nextInt();
		// 根据输入的学生学号，进行查询操作
		String strSql = "SELECT * FROM EDUSTUDENT WHERE STUID = ?";
		List lst = DBDriverFactory.getDBDriverInstance().query(strSql, new MapListHandler(), new Object[] { inStuid });
		// 打印查询结果
		pl.printList(lst);
		System.out.println("是否继续根据指定编号(学号)查询单个学生信息？(输入-1停止录入并返回上层功能菜单，输入其他键继续)");
		String strInput = sc.next();
		if (strInput.equals("-1")) {
			// 返回上层菜单--查询功能菜单
			queryMenu();
		} else {
			// 继续按学号查询
			queryOneStu();
		}
	}

	/**
	 * 3.根据姓名模糊查询学生信息
	 */
	public void queryNameStu() {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入需要姓名模糊查询的字：");
		String stName = sc.next();
		// 根据数据库语句要求，格式化一下输入的模糊匹配的字
		stName = "%" + stName + "%";
		// 进行数据库操作
		String strSql = "SELECT * FROM EDUSTUDENT WHERE STUNAME LIKE '" + stName + "' AND STUSTATE=0";
		List lst = DBDriverFactory.getDBDriverInstance().query(strSql, new MapListHandler());
		pl.printList(lst);
		System.out.println("是否继续根据姓名模糊查询学生信息？(输入-1停止录入并返回上层功能菜单，输入其他键继续)");
		String strInput = sc.next();
		if (strInput.equals("-1")) {
			// 返回上层菜单--查询功能菜单
			queryMenu();
		} else {
			// 继续进行查询
			queryNameStu();
		}
	}

	/**
	 * 4.根据地址模糊查询学生信息
	 */
	public void queryAdreStu() {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入需要根据地址模糊查询的字：");
		String stAdress = sc.next();
		// 根据数据库语句要求，格式化一下输入的模糊匹配的字
		stAdress = "%" + stAdress + "%";
		// 进行数据库操作
		String strSql = "SELECT * FROM EDUSTUDENT WHERE STUADDRESS LIKE '" + stAdress + "' AND STUSTATE=0";
		List lst = DBDriverFactory.getDBDriverInstance().query(strSql, new MapListHandler());
		// 打印输出结果
		pl.printList(lst);
		System.out.println("是否继续根据地址模糊查询学生信息？(输入-1停止录入并返回上层功能菜单，输入其他键继续)");
		String strInput = sc.next();
		if (strInput.equals("-1")) {
			// 根据数据库语句要求，格式化一下输入的模糊匹配的字
			queryMenu();
		} else {
			// 继续进行查询
			queryAdreStu();
		}
	}

	/**
	 * 5.根据年龄段模糊查询学生信息
	 */
	public void queryAgeStu() {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入需要根据年龄段模糊查询的年龄段(较小的年龄)：");
		int stAge1 = sc.nextInt();
		System.out.println("请输入需要根据年龄段模糊查询的年龄段(较大的年龄)：");
		int stAge2 = sc.nextInt();
		// 进行数据库操作
		String strSql = "SELECT * FROM EDUSTUDENT WHERE STUAGE >=? AND STUAGE<=? AND STUSTATE=0";
		List lst = DBDriverFactory.getDBDriverInstance().query(strSql, new MapListHandler(),
				new Object[] { stAge1, stAge2 });
		// 打印查询结果
		pl.printList(lst);
		System.out.println("是否继续根据年龄段模糊查询学生信息?(输入-1停止录入并返回上层功能菜单，输入其他键继续)");
		String strInput = sc.next();
		if (strInput.equals("-1")) {
			// 根据数据库语句要求，格式化一下输入的模糊匹配的字
			queryMenu();
		} else {
			// 继续进行查询
			queryAgeStu();
		}
	}

	/**
	 * 修改学生信息
	 */
	// 修改学生信息按照的是项目介绍表格上做的
	public void updateStu() {
		Scanner sc = new Scanner(System.in);
		// 进行数据库操作，显示所有的学生信息--因为删除信息用的是逻辑删除，
		// 这里显示了所有的学生的信息，可以对已删除的学生信息进行修改
		String strSql = "SELECT * FROM EDUSTUDENT";
		List lst = DBDriverFactory.getDBDriverInstance().query(strSql, new MapListHandler());
		// 打印查询结果
		pl.printList(lst);
		while (true) {
			System.out.println("请输入您要修改的学生学号：");
			int instuid = sc.nextInt();
			System.out.println("请输入新的学生初始密码：");
			String strStupword = sc.next();
			System.out.println("请输入新的学生姓名:");
			String strStuname = sc.next();
			System.out.println("请输入新的学生性别:");
			String strStuSex = sc.next();
			System.out.println("请输入新的学生年龄:");
			int inStuage = sc.nextInt();
			System.out.println("请输入新的学生电话(10位):");
			int inStutelnum = sc.nextInt();
			System.out.println("请输入新的学生地址:");
			String strStuaddress = sc.next();
			System.out.println("请输入新的学生就读状态:(0:在读|1:休学)");
			int instustate = sc.nextInt();
			// 将修改的学生信息在数据库中对其进行更新修改
			String strSql1 = "update EDUSTUDENT set STUPWORD='" + strStupword + "',STUNAME='" + strStuname + "',STUID='"
					+ instuid + "',STUSEX='" + strStuSex + "',STUAGE='" + inStuage + "',STUTELNUM='" + inStutelnum
					+ "',STUADDRESS='" + strStuaddress + "',STUSTATE='" + instustate + "'where STUID=?";
			int i = DBDriverFactory.getDBDriverInstance().update(strSql1, new Object[] { instuid });
			if (i > 0) {
				System.out.println("该学生信息修改成功！");
			} else {
				System.out.println("该学生信息修改失败！");
			}
			// 显示修改后的所有同学信息
			String strSql2 = "SELECT * FROM EDUSTUDENT";
			List lst1 = DBDriverFactory.getDBDriverInstance().query(strSql, new MapListHandler());
			pl.printList(lst1);
			System.out.println("是否继续修改其他学生的信息？(输入-1停止修改并返回上层功能菜单，输入其他键继续)");
			String strInput = sc.next();
			if (strInput.equals("-1")) {
				// 返回上层功能菜单
				logTeacher();
				break;
			}
		}

	}

	/**
	 * 删除学生信息--逻辑删除
	 */
	// 因为是逻辑删除，用的是update不是delete，所有学生被逻辑删除后，他的好友关系还存在
	public void deleteStu() {
		Scanner sc = new Scanner(System.in);
		// 查询所有未被删除的学生信息
		String strSql = "SELECT * FROM EDUSTUDENT WHERE STUSTATE=0";
		List lst = DBDriverFactory.getDBDriverInstance().query(strSql, new MapListHandler());
		pl.printList(lst);
		while (true) {
			System.out.println("请输入您要删除的学生学号：");
			int instuid = sc.nextInt();
			// 根据学号删除学生信息，进行数据库操作
			String strSql1 = "UPDATE  EDUSTUDENT SET STUSTATE=1 WHERE STUID=?";
			int i = DBDriverFactory.getDBDriverInstance().update(strSql1, new Object[] { instuid });
			if (i > 0) {
				System.out.println("该学生信息删除成功！");
			} else {
				System.out.println("该学生信息删除失败！");
			}
			// 显示删除后的所有未被删除的学生信息
			String strSql2 = "SELECT * FROM EDUSTUDENT WHERE STUSTATE=0";
			List lst1 = DBDriverFactory.getDBDriverInstance().query(strSql, new MapListHandler());
			pl.printList(lst1);
			System.out.println("是否继续删除其他学生的信息？(输入-1停止删除并返回上层功能菜单，输入其他键继续)");
			String strInput = sc.next();
			if (strInput.equals("-1")) {
				// 返回上层功能菜单
				logTeacher();
				break;
			}
		}
	}

	/**
	 * 查询验证该学号对应的学生信息是否已经存在
	 * 
	 * @param stuid
	 *            学生学号
	 * @return 查询结果
	 */
	private boolean isStudentexisted(Integer stuid) {
		// 查询语句
		String strSql = "SELECT * FROM EDUSTUDENT WHERE STUID = ?";
		// 查询结果
		List<EduStudent> lst = DBDriverFactory.getDBDriverInstance().query(strSql,
				new BeanListHandler<EduStudent>(EduStudent.class), new Object[] { stuid });
		// 返回判定的结果
		return lst != null && lst.size() > 0 ? true : false;

	}

}
